home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / ADP_0203.HAS < prev    next >
Text File  |  1996-06-16  |  5KB  |  194 lines

  1. *=======================================================
  2. *
  3. *    ADPCM->PCM 10.4kHz変換
  4. *
  5. *=======================================================
  6.  
  7. AtoP10n        macro        _X,_vol
  8.  
  9.         local        next
  10.  
  11.     .if    _X
  12.         cmpa.l        a3,a0            * トラップにかかった?
  13.         bcs        next
  14.         jsr        (a4)            * トラップ処理
  15.     .endif
  16. next:        moveq.l        #0,d0            * (4)
  17.         move.b        (a0)+,d0        * (8)
  18.         add.w        d0,d0            * (4)
  19.         adda.w        d0,a2            * (8)
  20.         add.w        (a2),d1            * (8)
  21.     .if    _vol=8
  22.         add.w        d1,(a1)+
  23.         add.w        d1,(a1)+
  24.     .else
  25.         move.w        d1,d0            * (4)
  26.         VOLUME        _vol,d0,d2
  27.         add.w        d0,(a1)+
  28.         add.w        d0,(a1)+
  29.     .endif
  30.         add.w        256*2(a2),d1        * (12)
  31.     .if    _vol=8
  32.         add.w        d1,(a1)+
  33.     .else
  34.         move.w        d1,d0            * (4)
  35.         VOLUME        _vol,d0,d2
  36.         add.w        d0,(a1)+
  37.     .endif
  38.         adda.w        256*2*2(a2),a2        * (16)
  39.  
  40.         endm
  41.  
  42. *=======================================================
  43.  
  44. AtoP_0203_mac    macro        _vol
  45.  
  46.         local        ADPCM_odd
  47.  
  48.         tst.b        CH_ODDEVEN(a5)        * ODD/EVEN FLAG    のチェック
  49.         bpl        ADPCM_odd        * 変換が1ADPCMずれる場合
  50.  
  51. *        前が奇数番目のADPCMを処理していた場合
  52. @@:        moveq.l        #(MIX_SIZE*2)/3-1,d2    * (4) 今回の処理中になんらかの
  53.         add.l        a0,d2            * (8) トラップが発生するか調べる
  54.         cmp.l        a3,d2            * (6)
  55.         bcs        @f            * (10)
  56.  
  57. *        トラップ判定あり
  58.         moveq.l        #(MIX_SIZE*2)/3-1,d6    * ADPCM -> PCM 変換
  59. 1:        AtoP10n        1,_vol
  60.         dbra        d6,1b
  61.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  62.     .if    _vol=8
  63.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  64.     .else
  65.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  66.     .endif
  67.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  68.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  69.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  70.         rts
  71.  
  72. *        トラップ判定無し
  73. @@:        moveq.l        #(MIX_SIZE*2)/3-1,d6    * ADPCM -> PCM 変換
  74. 1:        AtoP10n        0,_vol
  75.         dbra        d6,1b
  76.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  77.     .if    _vol=8
  78.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  79.     .else
  80.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  81.     .endif
  82.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  83.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  84.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  85.         rts
  86.  
  87. *        前が偶数番目のADPCMを処理していた場合
  88. ADPCM_odd:    moveq.l        #(MIX_SIZE*2)/3,d2    * (4) 今回の処理中になんらかの
  89.         add.l        a0,d2            * (8) トラップが発生するか調べる
  90.         cmp.l        a3,d2            * (6)
  91.         bcs        @f            * (10)
  92.  
  93. *        トラップ判定あり
  94.     .if    _vol=8
  95.         add.w        d1,(a1)+
  96.     .else
  97.         move.w        d1,d0
  98.         VOLUME        _vol,d0,d2
  99.         add.w        d0,(a1)+
  100.     .endif
  101.         moveq.l        #(MIX_SIZE*2)/3-1-1,d6    * ADPCM -> PCM 変換
  102. 1:        AtoP10n        1,_vol
  103.         dbra        d6,1b
  104.                             * ラストの1回
  105.         cmpa.l        a3,a0            * トラップにかかった?
  106.         bcs        1f
  107.         jsr        (a4)            * トラップ処理
  108. 1:        moveq.l        #0,d0            * (4)
  109.         move.b        (a0)+,d0        * (8)
  110.         add.w        d0,d0            * (4)
  111.         adda.w        d0,a2            * (8)
  112.         add.w        (a2),d1            * (8)
  113.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  114.     .if    _vol=8
  115.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  116.         add.w        d1,(a1)+
  117.         add.w        d1,(a1)+
  118.     .else
  119.         move.w        d1,d0            * (4)
  120.         VOLUME        _vol,d0,d2
  121.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  122.         add.w        d0,(a1)+
  123.         add.w        d0,(a1)+
  124.     .endif
  125.         add.w        256*2(a2),d1        * (12)
  126.         adda.w        256*2*2(a2),a2        * (16)
  127.  
  128.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  129.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  130.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  131.         rts
  132.  
  133. *        トラップ判定無し
  134. @@:
  135.     .if    _vol=8
  136.         add.w        d1,(a1)+
  137.     .else
  138.         move.w        d1,d0
  139.         VOLUME        _vol,d0,d2
  140.         add.w        d0,(a1)+
  141.     .endif
  142.         moveq.l        #(MIX_SIZE*2)/3-1-1,d6    * ADPCM -> PCM 変換
  143. 1:        AtoP10n        0,_vol
  144.         dbra        d6,1b
  145.                             * ラストの1回
  146.         moveq.l        #0,d0            * (4)
  147.         move.b        (a0)+,d0        * (8)
  148.         add.w        d0,d0            * (4)
  149.         adda.w        d0,a2            * (8)
  150.         add.w        (a2),d1            * (8)
  151.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  152.     .if    _vol=8
  153.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  154.         add.w        d1,(a1)+
  155.         add.w        d1,(a1)+
  156.     .else
  157.         move.w        d1,d0            * (4)
  158.         VOLUME        _vol,d0,d2
  159.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  160.         add.w        d0,(a1)+
  161.         add.w        d0,(a1)+
  162.     .endif
  163.         add.w        256*2(a2),d1        * (12)
  164.         adda.w        256*2*2(a2),a2        * (16)
  165.  
  166.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  167.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  168.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  169.         rts
  170.  
  171.         endm
  172.  
  173. *=======================================================
  174.  
  175. AtoP_0203_v00:    AtoP_0203_mac    0
  176. AtoP_0203_v01:    AtoP_0203_mac    1
  177. AtoP_0203_v02:    AtoP_0203_mac    2
  178. AtoP_0203_v03:    AtoP_0203_mac    3
  179. AtoP_0203_v04:    AtoP_0203_mac    4
  180. AtoP_0203_v05:    AtoP_0203_mac    5
  181. AtoP_0203_v06:    AtoP_0203_mac    6
  182. AtoP_0203_v07:    AtoP_0203_mac    7
  183. AtoP_0203_v08:    AtoP_0203_mac    8
  184. AtoP_0203_v09:    AtoP_0203_mac    9
  185. AtoP_0203_v10:    AtoP_0203_mac    10
  186. AtoP_0203_v11:    AtoP_0203_mac    11
  187. AtoP_0203_v12:    AtoP_0203_mac    12
  188. AtoP_0203_v13:    AtoP_0203_mac    13
  189. AtoP_0203_v14:    AtoP_0203_mac    14
  190. AtoP_0203_v15:    AtoP_0203_mac    15
  191. AtoP_0203_vnn:    AtoP_0203_mac    'n'
  192. AtoP_0203_non:    AtoP_0203_mac    'x'
  193.  
  194.